#include "zmqLogic.h"
#include "work/workglobal.h"

/**
 * 开启zmq消息队列并进行连接
 * @return 有一个失败就返回false
 */
bool Init_zmq()
{
    if (g_procType == 0)
    {
        // 与game进程
        g_zmq0.Initialize("../Ipc/logic.ipc", ZMQ_PAIR, true);
        if (!g_zmq0.RegisterRecvCallback(PutIntoBufFromLogic))
            return false; // 绑定接收处理函数失败
        if (!g_zmq0.StartBind())
            return false; // 开始监听失败
        if (!g_zmq0.StartWorkCycle())
            return false; // 开始接收的工作循环失败

        // 与net进程
        g_zmq3.Initialize("../Ipc/master.ipc", ZMQ_PAIR, false);
        if (!g_zmq3.RegisterRecvCallback(PutIntoBufFromNet))
            return false; // 绑定接收处理函数失败
        if (!g_zmq3.StartConnect())
            return false; // 开始连接失败
        if (!g_zmq3.StartWorkCycle())
            return false; // 开始接收的工作循环失败
    }
    else if (g_procType == 1)
    {
        // 与master进程
        g_zmq0.Initialize("../Ipc/logic.ipc", ZMQ_PAIR, false);
        if (!g_zmq0.RegisterRecvCallback(PutIntoBufFromLogic))
            return false; // 绑定接收处理函数失败
        if (!g_zmq0.StartConnect())
            return false; // 开始连接失败
        if (!g_zmq0.StartWorkCycle())
            return false; // 开始接收的工作循环失败

        // 与net进程
        g_zmq3.Initialize("../Ipc/game.ipc", ZMQ_PAIR, false);
        if (!g_zmq3.RegisterRecvCallback(PutIntoBufFromNet))
            return false; // 绑定接收处理函数失败
        if (!g_zmq3.StartConnect())
            return false; // 开始连接失败
        if (!g_zmq3.StartWorkCycle())
            return false; // 开始接收的工作循环失败
    }

    // 与log进程
    g_zmq1.Initialize("../Ipc/log.ipc", ZMQ_PUSH, false);
    if (!g_zmq1.StartConnect())
        return false; // 开始连接失败

    // 与db进程
    g_zmq2.Initialize("../Ipc/db2work.ipc", ZMQ_DEALER, false);
    if (!g_zmq2.StartConnect())
        return false; // 开始连接失败
    return true;
}

/**
 * 统一终止所有启用的zmq对象的函数
 */
void Stop_zmq()
{
    g_zmq0.StopWork();
    g_zmq1.StopWork();
    g_zmq2.StopWork();
    g_zmq3.StopWork();
}
